package cn.com.blueInfo.bpm.template.service.impl;

import cn.com.blueInfo.bpm.template.convert.EventActionConvert;
import cn.com.blueInfo.bpm.template.entity.EventAction;
import cn.com.blueInfo.bpm.template.repository.EventActionRepository;
import cn.com.blueInfo.bpm.template.request.EventActionDTO;
import cn.com.blueInfo.bpm.template.response.EventActionVO;
import cn.com.blueInfo.bpm.template.service.EventActionService;
import cn.com.blueInfo.core.util.SnowflakeIdGenerator;
import cn.com.blueInfo.utils.result.ResultInfo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 事件动作表 业务服务实现类
 * @author suxch
 * @since 2025-09-01 19:30:44
 */
@Log4j2
@Service
public class EventActionServiceImpl implements EventActionService {

    @Autowired
    private EventActionRepository eventActionRepository;

    @Autowired
    private SnowflakeIdGenerator snowflakeIdGenerator;

    @Autowired
    private EventActionConvert eventActionConvert;

    /**
     * 新增事件动作
     * @param eventActionDTO 事件动作参数
     */
    @Override
    public ResultInfo<Integer> addEventAction(EventActionDTO eventActionDTO) {
        EventAction eventAction = eventActionConvert.dtoToEntity(eventActionDTO);
        eventAction.setId(snowflakeIdGenerator.nextId());
        Integer addSize = eventActionRepository.createEventAction(eventAction);
        return ResultInfo.<Integer>builder().data(addSize).message("事件动作成功新增 {} 条").build();
    }

    /**
     * 批量新增事件动作
     * @param eventActionDTOList 事件动作参数列表
     */
    @Override
    public ResultInfo<Integer> batchAddEventAction(List<EventActionDTO> eventActionDTOList) {
        List<EventAction> eventActionList = eventActionConvert.dtoToEntity(eventActionDTOList);
        for (EventAction eventAction : eventActionList) eventAction.setId(snowflakeIdGenerator.nextId());
        Integer addSize = eventActionRepository.batchCreateEventAction(eventActionList);
        return ResultInfo.<Integer>builder().data(addSize).message("事件动作成功新增 {} 条").build();
    }

    /**
     * 删除事件动作
     * @param eventActionId 事件动作ID
     */
    @Override
    public ResultInfo<Integer> removeEventAction(Long eventActionId) {
        Integer removeSize = eventActionRepository.deleteEventAction(eventActionId);
        return ResultInfo.<Integer>builder().data(removeSize).message("事件动作成功删除 {} 条").build();
    }

    /**
     * 批量删除事件动作
     * @param eventActionIdList 事件动作ID列表
     */
    @Override
    public ResultInfo<Integer> batchRemoveEventAction(List<Long> eventActionIdList) {
        Integer removeSize = eventActionRepository.batchDeleteEventAction(eventActionIdList);
        return ResultInfo.<Integer>builder().data(removeSize).message("事件动作成功删除 {} 条").build();
    }

    /**
     * 更新部分事件动作
     * @param eventActionUpdatePartialDTO 事件动作参数
     */
    @Override
    public ResultInfo<Integer> modifyEventActionPartial(
            EventActionDTO.UpdatePartialDTO eventActionUpdatePartialDTO) {
        EventAction eventAction = eventActionConvert.dtoToEntity(eventActionUpdatePartialDTO);
        Integer modifySize = eventActionRepository.updateEventActionPartial(eventAction);
        return ResultInfo.<Integer>builder().data(modifySize).message("事件动作成功更新 {} 条").build();
    }

    /**
     * 更新全部事件动作
     * @param eventActionDTO 事件动作参数
     */
    @Override
    public ResultInfo<Integer> modifyEventAction(EventActionDTO eventActionDTO) {
        EventAction eventAction = eventActionConvert.dtoToEntity(eventActionDTO);
        Integer modifySize = eventActionRepository.updateEventAction(eventAction);
        return ResultInfo.<Integer>builder().data(modifySize).message("事件动作成功更新 {} 条").build();
    }

    /**
     * 查询一条事件动作
     * @param eventActionId 事件动作ID
     */
    @Override
    public ResultInfo<EventActionVO> queryEventActionById(Long eventActionId) {
        EventAction eventAction = eventActionRepository.getEventActionById(eventActionId);
        EventActionVO eventActionVO = eventActionConvert.entityToVO(eventAction);
        return ResultInfo.<EventActionVO>builder().data(eventActionVO).message("事件动作查询成功").build();
    }

    /**
     * 分页查询事件动作
     * @param eventActionQueryDTO 事件动作参数
     */
    @Override
    public ResultInfo<Page<EventActionVO>> queryEventActionPage(EventActionDTO.QueryDTO eventActionQueryDTO) {
        Page<EventAction> eventActionPage = eventActionRepository.getEventActionPage(eventActionQueryDTO);
        Page<EventActionVO> resultData = eventActionConvert.convertPage(eventActionPage);
        return ResultInfo.<Page<EventActionVO>>builder()
                .data(resultData)
                .message("事件动作分页查询成功，共 {} 条", resultData.getRecords().size())
                .build();
    }

    /**
     * 根据条件查询 事件动作 数量
     * @param eventActionQueryDTO 事件动作参数
     */
    @Override
    public ResultInfo<Long> queryEventActionCount(EventActionDTO.QueryDTO eventActionQueryDTO) {
        Long resultCount = eventActionRepository.getEventActionCount(eventActionQueryDTO);
        return ResultInfo.<Long>builder()
                .data(resultCount)
                .message("事件动作数量查询成功，共 {} 条", resultCount)
                .build();
    }

    /**
     * 根据条件查询 事件动作
     * @param eventActionQueryDTO 事件动作参数
     */
    @Override
    public ResultInfo<List<EventActionVO>> queryEventActionList(EventActionDTO.QueryDTO eventActionQueryDTO) {
        List<EventAction> eventActionList = eventActionRepository.getEventActionList(eventActionQueryDTO);
        List<EventActionVO> resultData = eventActionConvert.entityListToVoList(eventActionList);
        return ResultInfo.<List<EventActionVO>>builder()
                .data(resultData)
                .message("事件动作分页查询成功，共 {} 条", resultData.size())
                .build();
    }
}
